#ifndef PAGENUMBERSERVICE_H
#define PAGENUMBERSERVICE_H

#include <QString>
#include <QImage>
#include <QSize>
#include <QHash>
#include <QList>
#include <QPair>
#include <memory>

// 前向声明
class PageDisplayStrategy;
class PageNumberConfigFacade;
class ProcessingSettings;
class PageRenderContext;
class PageView;

/**
 * @brief Martin Fowler重构：Service Layer for Page Number Management
 *
 * 解决代码异味：
 * - Business Logic Scattered: 集中页码相关的业务逻辑
 * - Procedural Code: 将过程式代码组织成面向对象的服务
 * - Feature Envy: 封装跨多个对象的业务操作
 *
 * 设计原则：
 * - Service Layer Pattern: 提供粗粒度的业务API
 * - Single Responsibility: 专注于页码业务逻辑
 * - Dependency Inversion: 依赖抽象而非具体实现
 * - Command Pattern: 复杂操作封装为命令
 */
class PageNumberService
{
public:
    /**
     * @brief 页码渲染请求
     */
    struct RenderRequest {
        QImage sourceImage;          // 源图像
        int localPage = 1;          // 本地页码
        int globalPage = 1;         // 全局页码
        int totalPages = 1;         // 总页数
        QSize viewportSize;         // 视口尺寸
        bool isExportMode = false;  // 是否为导出模式
        QString customFormat;       // 自定义格式（可选）

        RenderRequest() = default;
        RenderRequest(const QImage& image, int local, int global, int total, const QSize& size)
            : sourceImage(image), localPage(local), globalPage(global), totalPages(total), viewportSize(size) {}
    };

    /**
     * @brief 页码渲染结果
     */
    struct RenderResult {
        QImage renderedImage;       // 渲染后的图像
        QString pageNumberText;     // 实际显示的页码文本
        bool success = false;       // 是否成功
        QString errorMessage;       // 错误信息（如果失败）

        RenderResult() = default;
        RenderResult(const QImage& image, const QString& text)
            : renderedImage(image), pageNumberText(text), success(true) {}

        static RenderResult failure(const QString& error) {
            RenderResult result;
            result.success = false;
            result.errorMessage = error;
            return result;
        }
    };

    /**
     * @brief 获取服务实例（单例模式）
     */
    static PageNumberService& instance();

    /**
     * @brief 初始化服务（依赖注入）
     */
    void initialize(PageNumberConfigFacade* configFacade,
                   ProcessingSettings* processingSettings);

    // =================================================================
    // 核心业务API
    // =================================================================

    /**
     * @brief 渲染带页码的页面（高级API）
     *
     * @param request 渲染请求
     * @return 渲染结果
     */
    RenderResult renderPageWithNumber(const RenderRequest& request);

    /**
     * @brief 为PageView渲染页面（便捷API）
     */
    QImage renderForPageView(PageView* pageView, const QImage& sourceImage, int pageIndex);

    /**
     * @brief 为导出渲染页面（便捷API）
     */
    QImage renderForExport(const QImage& sourceImage, int localPage, int globalPage, int totalPages);

    /**
     * @brief 预览页码效果（不修改原图）
     */
    QString previewPageNumber(int localPage, int globalPage, int totalPages, const QString& format = "");

    // =================================================================
    // 策略管理API
    // =================================================================

    /**
     * @brief 设置显示策略
     */
    void setDisplayStrategy(std::shared_ptr<PageDisplayStrategy> strategy);

    /**
     * @brief 获取当前显示策略
     */
    std::shared_ptr<PageDisplayStrategy> getDisplayStrategy() const;

    /**
     * @brief 自动选择最佳策略
     */
    void autoSelectStrategy(bool isExportMode, bool needsPageNumber = true);

    // =================================================================
    // 配置管理API
    // =================================================================

    /**
     * @brief 更新页码格式
     */
    void updatePageNumberFormat(const QString& format);

    /**
     * @brief 更新页码位置
     */
    void updatePageNumberPosition(int position);

    /**
     * @brief 更新页码样式
     */
    void updatePageNumberStyle(const QFont& font, const QColor& color);

    /**
     * @brief 启用/禁用页码显示
     */
    void setPageNumberEnabled(bool enabled);

    /**
     * @brief 批量应用配置变更
     */
    void applyConfigurationChanges();

    // =================================================================
    // 业务逻辑API
    // =================================================================

    /**
     * @brief 验证页码配置
     */
    bool validateConfiguration(QString& errorMessage) const;

    /**
     * @brief 计算最佳字体大小
     */
    int calculateOptimalFontSize(const QSize& imageSize) const;

    /**
     * @brief 检查页码是否会遮挡内容
     */
    bool checkPageNumberOverlap(const QImage& image, const QSize& viewportSize) const;

    /**
     * @brief 生成页码配置报告
     */
    QString generateConfigurationReport() const;

    // =================================================================
    // 批处理API
    // =================================================================

    /**
     * @brief 批量渲染多页
     */
    QList<RenderResult> batchRenderPages(const QList<RenderRequest>& requests);

    /**
     * @brief 批量预览页码
     */
    QStringList batchPreviewPageNumbers(const QList<QPair<int, int>>& pageNumbers, int totalPages);

private:
    PageNumberService() = default;
    ~PageNumberService() = default;

    // 禁用拷贝和赋值
    PageNumberService(const PageNumberService&) = delete;
    PageNumberService& operator=(const PageNumberService&) = delete;

    // 依赖组件
    PageNumberConfigFacade* m_configFacade = nullptr;
    ProcessingSettings* m_processingSettings = nullptr;
    std::shared_ptr<PageDisplayStrategy> m_displayStrategy;

    // 内部辅助方法
    PageRenderContext createRenderContext(const RenderRequest& request) const;
    RenderResult executeRender(const RenderRequest& request, const PageRenderContext& context);
    void validateDependencies() const;
    QString generateErrorContext(const QString& operation) const;

    // 性能优化
    mutable QHash<QString, QString> m_previewCache;  // 预览结果缓存
    void clearCache();
    QString getCacheKey(int localPage, int globalPage, int totalPages, const QString& format) const;
};

#endif // PAGENUMBERSERVICE_H